﻿using System.ServiceModel;
using System.Runtime.Serialization;
using System.Data;

namespace WcfServiceExchangeFiles
{
    [ServiceContract]
    public interface IExchangeFiles
    {
        //получить список файлов из папки "исходящие"
        [OperationContract]
        FileInfoDC[] GetFilesNamesOut(int clientID);

        //получить список файлов из папки "входящие"
        [OperationContract]
        FileInfoDC[] GetFilesNamesIn(int clientID);

        //получить количество кусочков в файле
        [OperationContract]
        long GetChunkLeight();

        //Получить кусочек файла
        [OperationContract]
        ChunkInfo GetChunk(string name, int chunkNumber);

        //отправить кусочек файла
        [OperationContract]
        bool SendChunk(string name,bool map, int chunkNumber, string chunk, int countBytes, string md5, bool newFile, bool endFile);

        //получить путь к папке "входящие"
        [OperationContract]
        string GetPathIn();

        //получить путь к папке "исходящие"
        [OperationContract]
        string GetPathOut();

        //удалить файл на сервере в папке "исходящие"
        [OperationContract]
        bool DelFileFromServOut(string fileName);

        //команда клиенту, что можно удалить файл в папке "исходящие"
        [OperationContract]
        bool DelFileFromClientOut(FileInfoDC fileInfo);

        //вызывается новым клиентом для идентификации
        [OperationContract]
        int NewClient(string ip, DataTable files, int pharmCode);

        //клиент сообщает что ничего не делает
        [OperationContract]
        void IAmFree(int clientid);

        //изменить информацию об IP клиента
        [OperationContract]
        void ClientIPUpd(int clientid, string newip);

        //получить актуальную версию установщика
        [OperationContract]
        FileNameVersion GetInstallerInfo();

        //получить актуальную версию клиента
        [OperationContract]
        FileNameVersion GetWinServiceInfo();

        //изменение информации о версии файлов на клиенте
        [OperationContract]
        void ClientFileVersionUpd(int clientid, string falename, string fileversion);

        //изменение кода аптеки
        [OperationContract]
        void ClientPharmCodeUpd(int clientid, int pharmCode);

        //получить информацию о файле службы
        [OperationContract]
        FileInfoDC[] GetUpdFiles();

        //получить путь для загрузки файла с клиента
        [OperationContract]
        string GetPathsFromServerIN(int clientId, bool map);

        //проверить наличие файла на сервере
        [OperationContract]
        FileInfoDC FileExists(string falePath);
    }

    [DataContract]
    public class FileInfoDC
    {
        string path = "";//путь
        long size = 0;//размер
        int countChunk = 0;//количество кусочков
        string md5checksum = "";//чексумма
        bool mapFile = false;//файл мап = true, остальные = false
        bool forAll = false;//только для клиента файл = true, для всех = false

        [DataMember]
        public string Path
        {
            get { return path; }
            set { path = value; }
        }

        [DataMember]
        public long Size
        {
            get { return size; }
            set { size = value; }
        }

        [DataMember]
        public int CountChunk
        {
            get { return countChunk; }
            set { countChunk = value; }
        }

        [DataMember]
        public string MD5Checksum
        {
            get { return md5checksum; }
            set { md5checksum = value; }
        }

        [DataMember]
        public bool MapFile
        {
            get { return mapFile; }
            set { mapFile = value; }
        }

        [DataMember]
        public bool ForAll
        {
            get { return forAll; }
            set { forAll = value; }
        }
    }

    [DataContract]
    public class ChunkInfo
    {
        string chunk = "";
        string md5checksum = "";

        [DataMember]
        public string Chunk
        {
            get { return chunk; }
            set { chunk = value; }
        }

        [DataMember]
        public string MD5Checksum
        {
            get { return md5checksum; }
            set { md5checksum = value; }
        }
    }

    [DataContract]
    public class FileNameVersion
    {
        string fileName = "";
        string fileVersion = "";
        int fileID = 0;

        [DataMember]
        public string FileName
        {
            get { return fileName; }
            set { fileName = value; }
        }

        [DataMember]
        public string FileVersion
        {
            get { return fileVersion; }
            set { fileVersion = value; }
        }

        [DataMember]
        public int Fileid
        {
            get { return fileID; }
            set { fileID = value; }
        }
    }
}
